home *** CD-ROM | disk | FTP | other *** search
/ Scene 96 / Scene 96 International Edition (Zyklop Software) (Disc 2) (1997).iso / misc / coding / vesacode / vesa.txt < prev   
Text File  |  1996-01-28  |  11KB  |  297 lines

  1.  
  2.     ▀▀▀█ █▀▀█ █▀▀█ █ █▀▀▀   █  █ █▀▀▀ █▀▀▀ █▀▀█   ▀▀█▀▀ █  █ ▀▀█▀▀ █▀▀█ █▀▀█
  3.     ▄▀▀  █▀▀█ █  █   ▀▀▀█   █ ▄▀ █▀   ▀▀▀█ █▀▀█     █   █  █   █   █  █ █▀█▀
  4.     ▀▀▀▀ ▀  ▀ ▀  ▀   ▀▀▀▀   ▀▀   ▀▀▀▀ ▀▀▀▀ ▀  ▀     ▀   ▀▀▀▀   ▀   ▀▀▀▀ ▀ ▀▀
  5.  ███▀▀▀▀█▀██▀█▀██▀███▀▀▀▀███▀▀███▀▀▀▀█▀▀▀▀█▀██▀█████▀███▀▀▀▀███▀███▀▀▀▀█▀█▀▀███
  6.  ███▄▀▀██ ▀▀ █ ██ ███▀▀▀ ███ █▄▀█ ▀███▀▀▀ █ ▀▀ █████ ███ ██ ███ ███ ██ █ ▀ ▀███
  7.  ███▀▀▀ █ ▀▀ █ ▀▀ █ █ ▀▀▀███ ██ █ ▀▀▀█ ▀▀▀█ ▀▀ ███▀▀ ▀▀█ ██ █▀▀ ▀▀█ ▀▀ █ ▀▀ ███
  8.  ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
  9.  
  10.  
  11.  
  12.  
  13.    1. Einleitung
  14.  
  15. Ich erkläre mich für nichts verantwortlich. Weder Schäden an Monitor,
  16. Grafikkarte, CD-ROM, Joystick, Modem, HD-LED oder Gehirn können mir
  17. angelastet werden.
  18.  
  19. Weiterhin verwende ich Markennamen ohne expliziten Hinweis.
  20.  
  21. Der Quellcode entstammt meinen Fingern. Deshalb behalte ich mir die Copyrights
  22. vor. Anfragen auf Veröffentlichung usw. werden gern beantwortet.
  23.  
  24. Wer den Kurs ohne meine Zustimmung wesentlich verändert, muß mit Todesstrafe
  25. rechnen. Jedoch darf der Quellcode verändert in Intros etc. mit Erwähnung
  26. meines Namens (!) verwendet werden.
  27.  
  28. Zum Kurs gehören folgende Datenströme:
  29.  
  30.    CUTZEROS.EXE              CutZeros - Tool
  31.    CUTZEROS.PAS              der Quellcode dazu
  32.    FILE_ID .DIZ              kurze Beschreibung für Mailboxen
  33.    LIZARD  .TXT              Infos über uns selbst
  34.    SINUS   .EXE              Sinus - Tool
  35.    SINUS   .PAS              Quellcode dazu
  36.    VESA    .ASM              Assembler-Quellcode
  37.    VESA    .COM              das eigentliche Intro
  38.    VESA    .TXT              diese Datei
  39.  
  40.  
  41.    2. Die Grafik
  42.  
  43.      2.1. VESA
  44.  
  45.        2.1.1. Allgemeines
  46.  
  47. VESA ist in mehreren Revisionen auf dem Markt. Ganz alte Grafikkarten genügen
  48. VESA 1.0, die Mehrheit VESA 1.2 und brandneu ist VESA 2.0. Das Programm selbst
  49. begnügt sich mit VESA 1.0.
  50.  
  51. Die Schnittstelle ist der Interrupt 10h. Im AH-Register hat stets 4Fhex zu
  52. stehen. War die auszuführende Funktion erfolgreich, steht in AH 0 und in
  53. AL 4Fhex. Ist AH jedoch 1, trat ein Fehler auf. Hat AL einen Inhalt ungleich
  54. 4Fhex, so wird die Funktion erst gar nicht unterstützt.
  55.  
  56. Treten Probleme bei der Ausführung auf, so sollte man einen neueren VESA-
  57. Treiber, z.B. UNIVBE probieren. Dies ist u.a. bei Cirrus-Logic-Karten der
  58. Fall.
  59.  
  60. Im folgenden wird VESA nur kurz überflogen. Tiefer in die Materie geht die
  61. c't 6/95, Seite 266ff und das Buch 'PC Intern' von Michael Tischer.
  62.  
  63.  
  64.        2.1.2. Initialisierung
  65.  
  66. Die Initialisierung erfolgt, indem zuerst die Existenz von VESA überprüft
  67. wird. Ist dies erfolgreich, wird der Modus 101hex (640*480, 256 Farben)
  68. getestet. War auch dies erfolgreich, werden benötigte Werte, wie der FAR-CALL-
  69. Pointer und die Granularität ausgelesen. Ungültige oder nicht bearbeitbare
  70. Situationen werden dabei auch überprüft.
  71.  
  72. Codeabschnitt: INITMODE
  73.  
  74.  
  75.        2.1.3. Punkte setzen
  76.  
  77. Ab Segment 0A000hex werden 64k des Bildschirmspeichers in den Hauptspeicher
  78. eingeblendet. Modus 101hex benötigt aber 640*480=307200 Bytes.
  79.  
  80. Dieses Problem umgeht man mit Hilfe der 'Window'-Technik. Diese erlaubt,
  81. unterschiedliche Teile des Bildschirmspeichers einzublenden.
  82.  
  83. Zuerst berechnet man den 32-Bit-Offset mit der Formel Y*MaxX+X, in unserem
  84. Fall Y*640+X. Die unteren 16 Bit sind der Offset im eingeblendeten Speicher.
  85. Die oberen 16 Bit übergibt man der FAR-CALL-Routine. Da diese aber immer noch
  86. recht zeitaufwendig ist, wird mittels der Variablen VESASEG versucht, unnötige
  87. Aufrufe zu vermeiden.
  88.  
  89. Codeabschnitte: SETWINDOW und PUTPIXEL
  90.  
  91.  
  92.      2.2. Zusätzliche Grafikoperationen
  93.  
  94.        2.2.1. Palettenmanipulation
  95.  
  96. Das sanfte Ein- und Ausblenden wäre mit Setzen von Pixeln nicht zu reali-
  97. sieren. Jedoch kommt uns hier die Palette zur Hilfe. Sie definiert für jeden
  98. Pixelwert einen RGB-Wert (Rot-Grün-Blau). Wird dieser verändert, ändern sich
  99. alle entsprechenden Pixel.
  100.  
  101. Wie der Name RGB schon andeutet, besteht der RGB-Wert aus 3 Byte. Sie sind
  102. jedoch auf 6 Bit beschärnkt, d.h. auf Werte zwischen 0 und 63. Jedoch lassen
  103. sich damit 2^(6+6+6)=262144 Farbtöne darstellen, theoretisch mehr, als das
  104. menschliche Auge unterscheiden kann.
  105.  
  106. Beim Ein- bzw. Ausblenden (Fading) wird folgende Technik verwendet:
  107.    Eine Schleife, die 64 mal durchlaufen wird, setzt jeden RGB-Wert neu. Davon
  108.    wird jeder Einzelwert wiederum (R, G, B) nach dieser Formel berechnet:
  109.         neuer Wert = Originalwert * Schleifendurchlauf / 64
  110.    Dabei darf der Originalwert nicht verändert werden.
  111.    Anschließend wird die Palette gesetzt, d.h. der Grafikkarte mitgeteilt.
  112.  
  113. Der DAC-Port, der für die Palette verantwortlich ist, befindet sich an 3C7hex
  114. bis 3C9hex. Dabei ist 3C9hex für die Daten verantwortlich. An 3C7hex wird der
  115. Pixelwert übergeben, für den in 3C9hex die RGB-Werte geschrieben werden. Für
  116. 3C8hex gilt das gleiche, nur für Lesezugriffe.
  117.  
  118. Codeabschnitte: SAVEPALETTE, SETPALETTE, PALBLACK, FADEIN, FADEOUT
  119.  
  120.  
  121.        2.2.2. Linien
  122.  
  123. Das Programm enthält zwei Linienalgorithmen, einer für horizontale und einer
  124. für vertikale Linien. Beliebige Linien werden nicht benötigt, eine ent-
  125. sprechende Implementation war deshalb auch nicht nötig. Wen es trotzdem
  126. interessiert, der lese Artikel über den Bresenham-Algorithmus.
  127.  
  128. Horizontale Linien:
  129.    Horizontale Linien werden beim Programmstart gebraucht und müssen deshalb
  130.    schnell gezeichnet werden. Also wird in 2 Fälle unterschieden:
  131.      a. Die Linie verteilt sich auf 2 'Windows'.
  132.      b. Die Linie liegt innerhalb eines 'Windows'.
  133.    Fall b tritt wesentlich häufiger auf, Fall a ist ein ärgerliches Beiwerk.
  134.    So wird Fall b mit schnellen Prozessorbefehlen bearbeitet, Fall a setzt
  135.    sich aus einer Schleife zusammen, die PUTPIXEL-ähnlich arbeitet.
  136.  
  137.  Vertikale Linien:
  138.    Vertikale Linien werden kaum gebraucht und werden deshalb (langsam) auf
  139.    PUTPIXEL-ähnliche Weise gezeichnet.
  140.  
  141. Codeabschnitte: XLINE, YLINE
  142.  
  143.  
  144.    3. Die Mathematik
  145.  
  146.      3.1. 3D-Theorie
  147.  
  148. Das Sternenfeld besteht aus einzelnen Punkten, die mittels ihrer X-,Y- und
  149. Z-Koordinate spezifiziert sind. Alle 3 Werte liegen im Bereich -63 bis +63.
  150.  
  151. Einzige verwendete mathematische Manipulation ist die Rotation. Sie erfolgt,
  152. indem zwei der drei Koordinaten wie in 2D mit Sinus und Cosinus um einen
  153. Mittelpunkt gedreht werden:
  154.                  a' = a*cos(alpha) - b*sin(alpha)
  155.                  b' = a*sin(alpha) + b*sin(alpha)
  156.  
  157. Für a und b werden X, Y und Z in allen Kombinationen eingesetzt. Entsprechend
  158. wird alpha mit dem jeweiligen Winkel gesetzt. Dies ist zwar mathematisch voll
  159. daneben geggriffen, genügt aber den Ansprüchen.
  160.  
  161. Codeabschnitte: ROTATE, Teile von SHOWPOINTS
  162.  
  163.  
  164.      3.2. Transformation nach 2D
  165.  
  166. Leider ist damit noch nicht die gesamte Arbeit geleistet. Der Monitor ist nur
  167. 2-dimensional. Dieses Problem wird mit Hilfe des Strahlensatzes gelöst. Die
  168. entsprechenden Formeln sind:
  169.                  2D-x = (x*i)/z
  170.                  2D-y = (y*i)/z
  171.  
  172. Dabei ist i der Abstand Mensch-Monitor und wird willkürlich mit 128 gewählt,
  173. da dies durch Bitverschiebung bewältigt werden kann. Außerdem wird Z um 200
  174. erhöht, da sonst das Sternenfeld nur teilweise sichtbar wäre.
  175.  
  176. Codeabschnitt: CONV3D
  177.  
  178.  
  179.    4. Sonstige Operationen
  180.  
  181.      4.1. 386er-Test
  182.  
  183. Im Quellcode werden nicht wenige 386-spezifische Befehle verwendet. Deshalb
  184. muß seine Existenz überprüft werden, um INT6 und Abstürze auf 286er etc. zu
  185. verhindern.
  186.  
  187. Das Prinzip ist, zu überprüfen, ob die Flagbits 13 bis 16 verändert werden
  188. können. Bis einschließlich 286er war dies nicht möglich.
  189.  
  190. Codeabschnitt: CHECK386
  191.  
  192.  
  193.      4.2. Digitalschrift
  194.  
  195. Die einzelnen Segmente der Digitalschrift werden nach folgendem Schema
  196. organisiert:
  197.                              111111
  198.                            4        5
  199.                            4        5
  200.                            4        5
  201.                              222222
  202.                            6        7
  203.                            6        7
  204.                            6        7
  205.                              333333
  206.  
  207. Im Programm werden die einzelnen Segmente binär codiert. So sieht die
  208. Codierung der 5 wie folgt aus:
  209.  
  210.           Bit     7 6 5 4 3 2 1 0
  211.                   0 1 0 0 1 1 1 1
  212.  
  213. Durch Bitoperatoren werden die einzelnen Bits herausgefiltert und geprüft.
  214.  
  215. Codeabschnitte: DIGITALCHAR, DIGITALTEXT
  216.  
  217.  
  218.      4.3. Zufallsgenerator
  219.  
  220. Das Sternenfeld wird per Zufallsgenerator erzeugt. Dieser ist extrem simpel
  221. und erhebt keinen Anspruch auf Genauigkeit. Das Prinzip ähnelt sehr stark der
  222. RANDOM-Funktion aus der Runtime Library von Borland Pascal 7.0. Deshalb will
  223. ich hier keinerlei Ansprüche auf eigene Kreativität erheben.
  224.  
  225. Der Zufallsgenerator wird nicht initialisiert und erzeugt deswegen immer die
  226. gleichen Zahlen.
  227.  
  228. Codeabschnitt: RANDOM
  229.  
  230.  
  231.      4.4. Daten initialisieren
  232.  
  233. Da ein relativ großer Datenoverhead vorhanden ist, der aber nur Nullen ent-
  234. hält, wurde dieser nachträglich entfernt. (siehe 5.)
  235.  
  236. Bei Programmstart ist dieser Bereich zwischen STARTOFZEROS und ENDOFZEROS in
  237. einem undefiniertem Zustand. Also wird er vorsichtshalber mit Nullen be-
  238. schrieben.
  239.  
  240. Dann wird das Sternenfeld per Zufall generiert und die Palette aufgebaut.
  241.  
  242. Aus dem 1. Quadranten der Sinusfunktion wird der Cosinus des 1.Quadranten
  243. berechnet. Aus diesem werden dann die 2., 3. und 4.Quadranten aufgebaut. Da
  244. Sinus und Cosinus mathematisch um 90 Grad verschoben sind, macht sich das
  245. Programm diese Eigenschaft in Form einer Speicherüberlappung zunutze.
  246.  
  247. Codeabschnitt: CLEARDATA, INITDATA
  248.  
  249.  
  250.    5. Tools
  251.  
  252. Neben den VESA-Files sind auch noch zwei kleine Hilfsprogramme dem Kurs
  253. beigelegt. Beide sind nicht dokumentiert, aber trotzdem leicht verständlich.
  254. Im einzelnen handelt es sich um:
  255.  
  256. SINUS.EXE:
  257. Dieses Programm berechnet lediglich im Assembler-konformen Format eine Sinus-
  258. tabelle im Bereich -127..+127
  259.  
  260. CUTZEROS.EXE:
  261. Die Dateigröße konnte mit CUTZEROS.PAS wesentlich verkürzt werden. Dabei
  262. machte ich mir die Eigenschaft zunutze, daß alle Daten am Dateiende nur Nullen
  263. enthalten. Diese werden abgeschnitten und zur Laufzeit erst belegt. Wer also
  264. VESA.ASM neu compiliert, wird eine Dateigröße von 8839 Bytes feststellen. Nach
  265. Programmlauf von CUTZEROS bleiben nur noch 1689 Bytes übrig. Dies entspricht
  266. etwa 19% der Ursprungsgröße. Bei dieser Größe versagten dann auch alle mir
  267. verfügbaren EXE- bzw. COM-Komprimierer.
  268.  
  269.  
  270.    6. Anhang
  271.  
  272. Natürlich sind alle Möglichkeiten noch lange nicht ausgereizt. So fehlt
  273. Musik, ein netter Scrolly und vieles mehr. Doch dies alles würde diesen Kurs
  274. ausufern lassen.
  275.  
  276. Zur Zeit besteht das Sternenfeld aus 300 Sternen. Allerdings werden auch noch
  277. 900 Sterne flüssig angezeigt (486DX40).
  278.  
  279. Für meine Arbeit habe ich als äußerst empfehlenswert empfunden:
  280.  
  281.   ∙ PC Intern 3.0  von Michael Tischer
  282.   ∙ c't 6/95, Seite 266ff
  283.   ∙ Das Assemblerbuch  von Trutz Eyke Podschun
  284.  
  285.  
  286.    7. Der Autor
  287.  
  288. Stephan "ZAN" Brumme kommt aus Luckenwalde bei Berlin, ist 17 und baut
  289. gerade sein Abi. Wenn er nicht programmiert ( Turbo Assembler 3.2, Borland
  290. Pascal 7.0 ) dann hört er Musik ( Smashing Pumpkins... ) oder spielt
  291. Basketball.
  292.  
  293.  
  294. Bugreports, Vorschläge usw. bitte in Ghost BBS posten.
  295.  
  296.  
  297.  Ciao.